import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from pylab import mpl

# 设置中文字体
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 设置正常显示符号
mpl.rcParams['axes.unicode_minus'] = False

# 解决中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']

# 1. 读数据
file_data = pd.read_csv("链家北京租房数据.csv")

# 2. 数据概况
print(file_data.shape)
print(file_data.info())  # 每一列数据的个数，对象类型...
"""
 #   Column   Non-Null Count  Dtype 
---  ------   --------------  ----- 
 0   区域       8223 non-null   object
 1   小区名称     8223 non-null   object
 2   户型       8223 non-null   object
 3   面积(㎡)    8223 non-null   object
 4   价格(元/月)  8223 non-null   int64 
dtypes: int64(1), object(4)
"""
print(file_data.describe())  # 只能对整型和浮点型类型数据聚合查看min，max...，因此这组数据的describe()只有价格这一列
"""
             价格(元/月)
count    8223.000000
mean     9512.297823
std      9186.752612
min       566.000000
25%      4800.000000
50%      6800.000000
75%     10000.000000
max    150000.000000
"""

# 3. 重复值处理
print(np.any(file_data.duplicated()))  # True 代表存在空值
file_data = file_data.drop_duplicates()

# 4. 缺失值处理
print(np.all(pd.notnull(file_data)))  # True 代表没有空值

# 5. 面积数据类型转换，将字符串转化为浮点型数据
print(file_data.head())
#    区域        小区名称    户型    面积(㎡)  价格(元/月)
# 0  东城     万国城MOMA  1室0厅  59.11平米    10000
# 1  东城    北官厅胡同2号院  3室0厅  56.92平米     6000
# 2  东城       和平里三区  1室1厅  40.57平米     6900
# 3  东城        菊儿胡同  2室1厅  57.09平米     8000
# 4  东城  交道口北二条35号院  1室1厅  42.67平米     5500
square_data = file_data["面积(㎡)"]
square_data = square_data.apply(lambda x: float(x[:-2]))
print(type(square_data))  # <class 'pandas.core.frame.DataFrame'>
print(square_data)
file_data["面积(㎡)"] = square_data
print("*" * 100)

# 6. 户型表达方式替换
huxing_data = file_data["户型"].values  # <class 'pandas.core.series.Series'>
print(type(huxing_data))
temp_list = []
for i in huxing_data:
    i = i.replace("房间", "室")
    i = i.replace("卫", "厅")
    temp_list.append(i)
file_data["户型"] = temp_list

# 7. 房源数量基本分析，按照区域聚合
print(file_data.groupby("区域").count())
df = pd.DataFrame({"数量": file_data.groupby("区域").count()["小区名称"]})
print(df.shape)
"""
         数量
区域         
东城      282
丰台      577
亦庄开发区   147
大兴      362
房山      180
昌平      347
"""
plt.figure(figsize=(10, 8), dpi=80)
# 解决中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
print(range(df.shape[0]))
print(df["数量"].values)
plt.bar(range(13), df["数量"].values, width=0.8)
plt.xticks(range(13), labels=df.index)
plt.xlabel("区域")
plt.ylabel("数量")
plt.show()

# 9.各区域平均租金分析
print(file_data)
"""
      区域        小区名称    户型   面积(㎡)  价格(元/月)
0     东城     万国城MOMA  1室0厅   59.11    10000
1     东城    北官厅胡同2号院  3室0厅   56.92     6000
2     东城       和平里三区  1室1厅   40.57     6900
3     东城        菊儿胡同  2室1厅   57.09     8000
4     东城  交道口北二条35号院  1室1厅   42.67     5500
"""
temp_data = file_data.groupby(by="区域").agg({"面积(㎡)": np.sum,
                                            "价格(元/月)": np.sum})
temp_data["每单元价格(元/㎡)"] = round(temp_data["价格(元/月)"] / temp_data["面积(㎡)"], 2)
temp_data["房屋总数量"] = file_data.groupby(by="区域").count()["小区名称"]
print(temp_data)
"""
           面积(㎡)   价格(元/月)  每单元价格(元/㎡)  房屋总数量
区域                                           
东城      27353.99   3945550      144.24    282
丰台      50922.79   4404893       86.50    577
亦庄开发区   15995.53   1318400       82.42    147
大兴      35884.15   2286950       63.73    362
房山      15275.41    726750       47.58    180
昌平      35972.92   2521515       70.09    347
"""
place_num = temp_data.shape[0]
print(place_num)
fig = plt.figure(figsize=(10, 8), dpi=80)
# 显示折线图
ax1 = fig.add_subplot(111)  # 左y轴
ax1.plot(range(place_num), temp_data["每单元价格(元/㎡)"], "or-", label="价格")
for i, (_x, _y) in enumerate(zip(range(place_num), temp_data["每单元价格(元/㎡)"])):
    plt.text(_x + 0.2, _y, _y)
ax1.set_ylim([0, 160])
ax1.set_ylabel("价格")
plt.legend(loc="upper right")

# 显示条形图，alpha代表透明度
ax2 = ax1.twinx()  # 右y轴
plt.bar(range(place_num), temp_data["房屋总数量"], label="数量", alpha=0.2, color="green")
ax2.set_ylabel("数量")
plt.legend(loc="upper left")
plt.xticks(range(place_num), temp_data.index)
for _x, _y in zip(range(place_num), temp_data["房屋总数量"]):
    plt.text(_x - 0.2, _y + 10, _y)
plt.show()

# 10. 面积区间分析
area_divide = [1, 30, 50, 70, 90, 120, 140, 160, 1200]
area_cut = pd.cut(file_data["面积(㎡)"], area_divide)
square_df = pd.DataFrame(area_cut.value_counts())  # <class 'pandas.core.frame.DataFrame'>
print(area_cut.value_counts())
print(square_df)
square_df["占比率"] = round(square_df["count"] / file_data.shape[0], 2) * 100
print(square_df)
"""
             count   占比率
面积(㎡)                   
(50, 70]      1566  27.0
(70, 90]      1094  19.0
(90, 120]     1082  19.0
(30, 50]       710  12.0
(160, 1200]    625  11.0
(120, 140]     381   7.0
(140, 160]     274   5.0
(1, 30]         41   1.0
"""
plt.figure(figsize=(10, 8), dpi=80)
plt.axes(aspect=1)  # plt.axes(aspect=1) 函数用于创建一个新的坐标轴。aspect参数设置坐标轴的比例，这里设置为1表示x轴和y轴的比例相同
plt.pie(x=square_df["count"], labels=square_df.index, autopct="%.2f %%", startangle=90)
plt.legend()
plt.show()
